package br.com.sisgerenciamento.produto;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import br.com.sisgerenciamento.dto.produto.ProdutoDTO;
import br.com.sisgerenciamento.dto.unidade.UnidadeProdutoDTO;
import br.com.sisgerenciamento.dto.usuario.UsuarioDTO;
import br.com.sisgerenciamento.exceptions.ApplicationException;
import br.com.sisgerenciamento.facade.produto.ProdutoFacade;
import br.com.sisgerenciamento.model.produto.TipoProdutoEnum;
import br.com.sisgerenciamento.util.Constants;
import br.com.sisgerenciamento.util.Mensagem;
import br.com.sisgerenciamento.utilidades.TreatString;

import com.google.gson.Gson;

public class ProdutoAction extends DispatchAction{

	public ActionForward inicio( ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response){
		ProdutoForm form = (ProdutoForm) actionForm;
		try {
			form.reset(mapping, request);
			List<UnidadeProdutoDTO> unidades;
			unidades = ProdutoFacade.getInstance().listarUnidades();
			form.setUnidades(unidades);
			form.setTipoProduto(TipoProdutoEnum.listar());
			form.getProduto().setStatus("1");
		} catch (ApplicationException e) {
			form.addMensagem(request, Mensagem.ERRO, e.getMessage());
			e.printStackTrace();
		}
		return mapping.findForward( "cadastro" );
	}

	public ActionForward list( ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response){
		ProdutoForm form = (ProdutoForm) actionForm;
		form.reset(mapping, request);
		return mapping.findForward( "list" );
	}
	
	public ActionForward salvar( ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response){
		ProdutoForm form = (ProdutoForm) actionForm;
		try {
			form.getProduto().validar();
			form.getProduto().setUsuario(new UsuarioDTO());
			form.getProduto().getUsuario().setCodigo((String) request.getSession().getAttribute(Constants.CODIGO_USUARIO));
			form.setProduto(ProdutoFacade.getInstance().salvar(form.getProduto()));
			form.addMensagem(request, Mensagem.SUCESSO, "Produto salvo com sucesso!");
			return mapping.findForward( "list" );
		} catch (ApplicationException e) {
			form.addMensagem(request, Mensagem.ERRO,"Erro ao salvar produto: "+ e.getMessage());
		}
		return mapping.findForward( "cadastro" );
	}
	
	public void autoComplete( ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response ) {
		ProdutoForm form = (ProdutoForm) actionForm;
		String json = "";
		try {
			List<String> list = ProdutoFacade.getInstance().autoComplete(form.getDescricaoProduto());
			Gson gson = new Gson();
			json = gson.toJson(list);
			response.getWriter().write( json );
		} catch ( Exception e ) {
			e.printStackTrace();
		}
	}
	
	public ActionForward buscar( ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response){
		ProdutoForm form = (ProdutoForm) actionForm;
		
		if(TreatString.isNotBlank(form.getDescricaoProduto())){
			form.setProdutoDTOs(ProdutoFacade.getInstance().buscarPorDescricao(form.getDescricaoProduto().trim()));
		}else{
			try {
				form.setProdutoDTOs(ProdutoFacade.getInstance().listar());
			} catch (ApplicationException e) {
				e.printStackTrace();
			}
		}
		return mapping.findForward( "list" );
	}

	public ActionForward carregarProduto( ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response){
		ProdutoForm form = (ProdutoForm) actionForm;
		try{
			ProdutoDTO dto =  ProdutoFacade.getInstance().obterProdutoPorCodigo(Long.valueOf(form.getCodigoProduto()));
			
			List<UnidadeProdutoDTO> unidades;
			unidades = ProdutoFacade.getInstance().listarUnidades();
			form.setUnidades(unidades);
			
			if(dto != null){
				form.setProduto(dto);
				form.setTipoProduto(TipoProdutoEnum.listar());
			}else{
				form.addMensagem(request, Mensagem.ERRO, "Erro ao carregar produto!");
			}
		}catch (Exception e) {
			form.addMensagem(request, Mensagem.ERRO, "Erro ao carregar produto! Erro:"+e.getMessage());
		}
		return mapping.findForward( "cadastro" );
	}


}
